////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxtitan17xfactory.h
/// @brief Titan17xFactory class declarations
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXTITAN17XFACTORY_H
#define CAMXTITAN17XFACTORY_H

#include "camxhwfactory.h"

CAMX_NAMESPACE_BEGIN

/// Forward Declarations
class HAL3Device;
class Node;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Class that implements the factory to create HW dependent object hierarchies.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class Titan17xFactory final : public HwFactory
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Create
    ///
    /// @brief  Static method to allocate the Titan17xFactory Object.
    ///
    /// @return Pointer to the concrete HW Factory object
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static HwFactory* Create();

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~Titan17xFactory
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ~Titan17xFactory();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// HwCreateNode
    ///
    /// @brief  Creates the concrete node object.
    ///
    /// @param  pCreateInputData  Node create input data
    /// @param  pCreateOutputData Node create output data
    ///
    /// @return Returns a pointer to the node if successful, NULL otherwise
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual Node* HwCreateNode(
        const NodeCreateInputData* pCreateInputData,
        NodeCreateOutputData*      pCreateOutputData
    ) const;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// HwCreateSettingsManager
    ///
    /// @brief  Creates the hardware-specific settings manager.
    ///
    /// @return The hardware-specific settings manager object as a hardware-independent (base class) settings manager pointer.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual SettingsManager* HwCreateSettingsManager() const;

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Titan17xFactory
    ///
    /// @brief  Constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    Titan17xFactory();

    Titan17xFactory(const Titan17xFactory&) = delete;             ///< Disallow the copy constructor.
    Titan17xFactory& operator=(const Titan17xFactory&) = delete;  ///< Disallow assignment operator.
};

CAMX_NAMESPACE_END

#endif // CAMXTITAN17XFACTORY_H
